import logging
import logging.handlers
from flask import request
import os
#自定义日志的输出格式，记录错误信息
class RequestShoppingFormatter(logging.Formatter):
    '''
    自定义的日志输出格式
    '''

    def format(self, record):
        record.url = request.url  # 需要在日志中记录请求地址
        record.remote_addr = request.remote_addr  # 需要在日志中记录客户端的地址
        return super().format(record)



def create_logger(app):#创建一个个性化的logger对象
    '''
    设置日志的配置
    :param app:flask中的app对象
    :return:
    '''
    logging_file_dir=app.config['LOGING_FILE_DIR'] #日志文件所在目录
    logging_file_max_bytes=app.config['LOGGING_FILE_MAX_BYTES'] #日志的最大大小
    logging_file_backup=app.config['LOGING_FILE_BACKUP'] #日志文件的数量
    logging_file_level=app.config['LOGGING_LEVEL']#日志文件的级别
    #设置日志的输出格式（针对文件的输出格式）
    request_formatter=RequestShoppingFormatter('[%(asctime)s] %(remote_addr)s 请求 %（url）s \t %(levelname)s 在 %（module）s %(lineno)d : %(message)s')
   #检查目录是否存在，不存在自己创建一个
    if os.path.isdir(logging_file_dir):
        pass
    else:
        os.mkdir(logging_file_dir)



    #设置日志的存储位置
    flask_file_handle=logging.handlers.RotatingFileHandler(filename=os.path.join(logging_file_dir,'shopping.log'),
                                         maxBytes=logging_file_max_bytes,
                                         backupCount=logging_file_backup)
    #给当前的handler设置格式
    flask_file_handle.setFormatter(request_formatter)
    #得到一个logger对象
    flask_logger=logging.getLogger('Shopping')
    flask_logger.addHandler(flask_file_handle)
    flask_logger.setLevel(logging_file_level)

    #整个项目需要两个handler：文件里，控制台上各一个
    flask_console_handler =logging.StreamHandler()
    flask_console_handler.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)s %（module）s %(lineno)d : %(message)s'))
    #当项目运行环境为调试模式，采用控制台输出
    if app.debug:
        flask_logger.addHandler(flask_console_handler)